"use strict";

var uk = require('./def.js');

uk.t_buffs={};

/** 创建buff */
uk.create_buff=function(buffid){
    if(!uk.t_buffs.hasOwnProperty(buffid)){
        console.log('创建buff失败，未能找到制定id的buff -> '+buffid);
        return null;
    }
    var r = {};
    var b = uk.t_buffs[buffid];
    r.id = uk.getnewguidn();
    r.round = b.round;
    r.template = b;
    r.owner = null; /** 我属于谁 */
    r.giver = null; /** 谁把我给人的 */
    r.alive = true; /** 是否活着 */
    return r;
}

var _defcomparator={
    /** 回合开始比较器 */
    round_begin_comparator:function(buff,act,statu,src,tag,actp,matchdata){
        return act == uk.events.ROUND_BEGIN
        && (matchdata==null||statu == matchdata.care);
    },

    /** 回合结束比较器 */
    round_end_comparator:function(buff,act,statu,src,tag,actp,matchdata){
        return act == uk.events.ROUND_END
        && (matchdata==null||statu == matchdata.care);
    },

    /** 通用属性变化比较器 */
    prop_change_comparator:function(buff,act,statu,src,tag,actp,matchdata){
        return act == uk.events.CHANGE_PROP
        && (matchdata==null||statu == matchdata.care && actp.hasOwnProperty(matchdata.prop));
    },

    /** 有buff被添加时 */
    any_buff_add_comparator:function(buff,act,statu,src,tag,buffid,matchdata){
        return act == uk.events.ADD_BUFF
        && (matchdata==null||statu == matchdata.care && buffid==matchdata.buffid);
    },
    
    /** 有buff被删除时 */
    any_buff_del_comparator:function(buff,act,statu,src,tag,buffid,matchdata){
        return act == uk.events.DEL_BUFF
        && (matchdata==null||statu == matchdata.care && buffid==matchdata.buffid);
    },

    /** buff自己被添加时 */
    buff_add_comparator:function(buff,act,statu,src,tag,actp,matchdata){
        return act == uk.events.ADD_BUFF && buff == actp;
    },
    
    /** buff自己被删除时 */
    buff_del_comparator:function(buff,act,statu,src,tag,actp,matchdata){
        return act == uk.events.DEL_BUFF && buff == actp;
    }
};
uk.defcomparator = _defcomparator;

/** 定义buff
 * target:目标类型,self or target
 * action:执行什么动作
 * actarg:执行动作的参数
 * type:类型，参考uk.buff_types
 * keepround:持续回合数
 * match:匹配函数，查看是否满足执行动作条件
 * matchdata:匹配函数附带比较参数
 */
uk.def_buff=function(id,name,target,action,actarg,type,keepround,match,matchdata){
    var b = {};
    b.id = id;
    b.__action=action;
    b.__actarg=actarg;
    b.name = name;
    b.target = target;
    b.__on_match = match;
    b.__matchdata = matchdata;
    b.round = keepround;
    b.type = type;
    b.on_action = function(buff,act,statu,src,tag,actp,changed){
        if(this.__on_match(buff,act,statu,src,tag,actp,this.matchdata)){
            return this.__action(src,this.target == uk.target_types.SELF?src:tag,this.__actarg,changed);
        }
        return true;
    };
    b.on_deatch=function(buff,changed){
        if(this.type & uk.buff_types.REMOVE_RECOVER){
            var _actarg={};
            for(var _k in this.__actarg){/** 删除buff的时候需要反向操作属性 */
                _actarg[_k] = -this.__actarg[_k];
            }
            return this.__action(buff.owner,buff.owner,_actarg,changed);
        }
    }
    uk.t_buffs[id] = b;
}

/** 属性变更
 * target:目标类型,self or target
 * prop:更改的属性
 * type:类型，参考uk.buff_types
 * keepround:持续回合数
 * match:匹配函数，查看是否满足执行动作条件
 * matchdata:匹配函数附带比较参数
 */
uk.def_buff_addprop=function(id,name,target,prop,type,keepround,match,matchdata){
    return uk.def_buff(id,name,target,uk.actions.change_props,prop,type,keepround,match,matchdata);
}

/** 攻击
 * target:目标类型,self or target
 * prop:更改的属性
 * type:类型，参考uk.buff_types
 * keepround:持续回合数
 * match:匹配函数，查看是否满足执行动作条件
 * matchdata:匹配函数附带比较参数
 */
uk.def_buff_attack=function(id,name,target,prop,type,keepround,match,matchdata){
    return uk.def_buff(id,name,target,uk.actions.attack,prop,type,keepround,match,matchdata);
}

/** 恢复
 * target:目标类型,self or target
 * prop:恢复的属性
 * type:类型，参考uk.buff_types
 * keepround:持续回合数
 * match:匹配函数，查看是否满足执行动作条件
 * matchdata:匹配函数附带比较参数
 */
uk.def_buff_recover=function(id,name,target,prop,type,keepround,match,matchdata){
    return uk.def_buff(id,name,target,uk.actions.recover,prop,type,keepround,match,matchdata);
}

/** 每回合回血2，持续3回合，回合开始前 */
uk.def_buff_recover(1,'神光',uk.target_types.SELF,{hp:2},uk.buff_types.OVERLAPPED_ABLE,3,_defcomparator.round_begin_comparator,{care:uk.event_status.BEFORE});

/** 每回合失血1，持续3回合，回合开始前 */
uk.def_buff_addprop(2,'蛇毒',uk.target_types.ENEMY,{hp:-1},uk.buff_types.OVERLAPPED_ABLE,3,_defcomparator.round_begin_comparator,{care:uk.event_status.BEFORE});

/** 增加1点防御 */
uk.def_buff_addprop(3,'木盾',uk.target_types.SELF,{def:1},uk.buff_types.REMOVE_RECOVER,2,_defcomparator.buff_add_comparator,{care:uk.event_status.AFTER});